﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Systemet.Views
{
    public partial class Resursallokering : UserControl
    {
        private Domain.KostnadsBudgController kBC;
        private List<Personal> staff;
        private List<Produkt> products;
        private List<ResursAllokeringar> Prodallocations;
        private List<AktivitetsAllokeringar> activityAllocations;
        private IEnumerable<Aktivietetsregister> activities;
        private IEnumerable<Personalavdelning> AvdelningsAllocations;
        private string currentAvdelning;
        private string currentCellValue;
        private bool CellChanging = false;
        DataTable dt;
        DataGridViewCell dgvC;
        public Resursallokering()
        {
            InitializeComponent();
            AccessController.Instance.MainView = this;

        }
        //Clearar
        public void ClearDgv()
        {

            if (this.dGVResursAllokering.DataSource != null)
            {
                this.dGVResursAllokering.DataSource = null;
            }
            else
            {
                this.dGVResursAllokering.Rows.Clear();
            }
        }
        //Vyer
        private void CustomView(object sender, EventArgs e)
        {
            if (dGVResursAllokering.Rows.Count > 0)
            {
                bool IsFullView = true;
                if (sender == rBCustomVy)
                {
                    IsFullView = false;
                }

                dGVResursAllokering.Columns[2].Visible = IsFullView;
                dGVResursAllokering.Columns[3].Visible = IsFullView;
                dGVResursAllokering.Columns[4].Visible = IsFullView;
                dGVResursAllokering.Columns[5].Visible = IsFullView;
            }

        }
        //Uppdaterar/Skapar DT
        public void UpdateDgVAllocations(List<Produkt> prods, List<Personal> staffList, List<ResursAllokeringar> ProductAllos, IEnumerable<Aktivietetsregister> activ, List<AktivitetsAllokeringar> ActivityAllos, string prodOmrade, List<Personalavdelning> avdelningsAllokeringar)
        {

            currentAvdelning = prodOmrade;
            products = prods;
            staff = staffList;
            Prodallocations = ProductAllos;
            activities = activ;
            activityAllocations = ActivityAllos;
            AvdelningsAllocations = avdelningsAllokeringar;

            dt = new DataTable();
            dt.Columns.Add(new DataColumn("Persnummer", typeof(string)));
            dt.Columns.Add(new DataColumn("Namn", typeof(string)));
            dt.Columns.Add(new DataColumn("Syssel sättnings grad", typeof(string)));
            dt.Columns.Add(new DataColumn("Vakans avdrag", typeof(string)));
            dt.Columns.Add(new DataColumn("Års arbetare", typeof(string)));
            dt.Columns.Add(new DataColumn("Disponibelt", typeof(string)));
            dt.Columns.Add(new DataColumn("Totalt", typeof(string)));

            //beroende på om det är Aktiviter eller Produkter
            if (prodOmrade.Contains("Drift") || prodOmrade.Contains("Utv"))
            {
                dt.Columns.Add(new DataColumn("Gem Akt.", typeof(string)));
                dt.Columns.Add(new DataColumn("Fördelat på produkter", typeof(string)));
            }
            if (prodOmrade.Contains("Adm") || prodOmrade.Contains("mark"))
            {
                dt.Columns.Add(new DataColumn("Gem PROD.", typeof(string)));
                dt.Columns.Add(new DataColumn("Fördelat på Aktiviteter", typeof(string)));
            }

            foreach (Personal p in staff)
            {
                int disponiblet = 0;
                int currentAvdPossibleAllocation = 0;
                int allokeradTidPCurrentAvd = 0;

                int ProdFordelning = 0;
                int gemADM = 0;
                int totalt = 0;
                int arsArbetare = 0;

                foreach (Personalavdelning pA in avdelningsAllokeringar)
                {
                    if (p.Personnummer == pA.personnummer)
                    {
                        if (pA.avdelningsnamn.Contains(prodOmrade))
                        {
                            currentAvdPossibleAllocation = currentAvdPossibleAllocation + pA.procentsats;
                        }
                    }
                }
                if (prodOmrade.Contains("Drift") || prodOmrade.Contains("Utv"))
                {
                    foreach (ResursAllokeringar rA in Prodallocations)
                    {
                        if (p.Personnummer == rA.PersNr)
                        {
                            if (rA.Avdelningsnamn.Contains(prodOmrade))
                            {
                                allokeradTidPCurrentAvd = allokeradTidPCurrentAvd + (int)rA.ProcentSats;
                            }
                            ProdFordelning = ProdFordelning + (int)rA.ProcentSats;
                        }

                    }
                    foreach (AktivitetsAllokeringar aA in activityAllocations)
                    {
                        if (p.Personnummer == aA.PersNr)
                        {
                            gemADM = gemADM + (int)aA.Procentsats;
                        }

                    }
                }

                if (prodOmrade.Contains("Adm") || prodOmrade.Contains("mark"))
                {
                    foreach (ResursAllokeringar rA in Prodallocations)
                    {
                        if (p.Personnummer == rA.PersNr)
                        {
                            gemADM = gemADM + (int)rA.ProcentSats;
                        }

                    }
                    foreach (AktivitetsAllokeringar aA in activityAllocations)
                    {
                        if (p.Personnummer == aA.PersNr)
                        {
                            if (aA.Avdelningsnamn.Contains(prodOmrade))
                            {
                                allokeradTidPCurrentAvd = allokeradTidPCurrentAvd + (int)aA.Procentsats;
                            }
                            ProdFordelning = ProdFordelning + (int)aA.Procentsats;

                        }

                    }
                }

                arsArbetare = (p.Sysselsättningsgrad - p.Vakansavdrag);
                totalt = gemADM + ProdFordelning;
                disponiblet = currentAvdPossibleAllocation - allokeradTidPCurrentAvd;
                dt.Rows.Add(p.Personnummer, p.Förnamn + " " + p.Efternamn, p.Sysselsättningsgrad, p.Vakansavdrag, arsArbetare.ToString(), disponiblet.ToString(), totalt.ToString(), gemADM.ToString(), ProdFordelning.ToString());

            }


            if (prodOmrade.Contains("Drift") || prodOmrade.Contains("Utv"))
            {
                foreach (Produkt p in products)
                {
                    if (p.Produktionsomrade.Contains(prodOmrade))
                    {
                        if (dt.Columns[p.ProduktNamn.ToString()] == null)
                        {
                            dt.Columns.Add(new DataColumn(p.ProduktNamn.ToString(), typeof(string)));
                        }
                    }
                }

                dGVResursAllokering.DataSource = dt;
                AllocationSortmentProducts(dt, Prodallocations, prodOmrade);

            }
            if (prodOmrade.Contains("mark") || prodOmrade.Contains("Adm"))
            {
                foreach (Aktivietetsregister a in activities)
                {
                    if (a.avdelningsnamn.Contains(prodOmrade))
                    {
                        if (dt.Columns[a.aktivitet.ToString()] == null)
                        {
                            dt.Columns.Add(new DataColumn(a.aktivitet.ToString(), typeof(string)));
                        }
                    }
                }
                dGVResursAllokering.DataSource = dt;
                AllocationSortmentActivities(dt, activityAllocations);

            }

            dgvLayout();
        }

        public void AllocationSortmentProducts(DataTable dT, List<ResursAllokeringar> allo, string prodomr)
        {

            foreach (DataRow dR in dT.Rows)
            {
                foreach (DataColumn dC in dt.Columns)
                {
                    foreach (Personal p in staff)
                    {
                        if (dR[dC].ToString() == p.Personnummer)
                        {
                            foreach (ResursAllokeringar rA in allo)
                            {
                                if (p.Personnummer == rA.PersNr)
                                {
                                    string colName = rA.Produkt;
                                    if (dR.Table.Columns[colName] != null)
                                    {

                                        dR[colName] = rA.ProcentSats;
                                    }
                                }
                            }
                        }
                    }
                }

            }


        }
        public void AllocationSortmentActivities(DataTable dT, List<AktivitetsAllokeringar> allo)
        {

            foreach (DataRow dR in dT.Rows)
            {
                foreach (DataColumn dC in dt.Columns)
                {
                    foreach (Personal p in staff)
                    {
                        if (dR[dC].ToString() == p.Personnummer)
                        {
                            foreach (AktivitetsAllokeringar aA in allo)
                            {
                                if (p.Personnummer == aA.PersNr)
                                {
                                    string colName = aA.Aktivitet;
                                    if (dR.Table.Columns[colName] != null)
                                    {
                                        dR[colName] = aA.Procentsats;
                                    }
                                }
                            }
                        }
                    }
                }


            }


        }
        //Sätter storlek på Gridview columner
        private void dgvLayout()
        {
            dGVResursAllokering.Columns[0].Visible = false;
            dGVResursAllokering.Columns[1].Width = 130;
            dGVResursAllokering.Columns[2].Width = 70;
            dGVResursAllokering.Columns[3].Width = 40;
            dGVResursAllokering.Columns[4].Width = 40;
            dGVResursAllokering.Columns[5].Width = 40;
            dGVResursAllokering.Columns[6].Width = 40;
            dGVResursAllokering.Columns[7].Width = 40;
            dGVResursAllokering.Columns[8].Width = 70;
            //  dGVResursAllokering.Columns[9].Width = 70;
            dGVResursAllokering.Columns[0].Frozen = true;
            dGVResursAllokering.Columns[1].Frozen = true;
        }

        private void dGVResursAllokering_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {

            if (CellChanging)
            {
                CellChanging = false;
                kBC = new Domain.KostnadsBudgController();

                bool IsNewAllocation = false;
                string nyAllokering = dGVResursAllokering.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
                string columnName = dGVResursAllokering.Columns[e.ColumnIndex].Name.ToString();
                string personnummer = dGVResursAllokering.Rows[e.RowIndex].Cells[0].Value.ToString();
                int row = e.RowIndex;
                int kolumn = e.ColumnIndex;

                //Borttagning
                if (nyAllokering == "" && currentCellValue != "")
                {
                    if (MessageBox.Show("Vill du verkligen ta bort allokeringen " + currentCellValue + "% för " + columnName, "Ta bort allokering?", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                    {
                        if (currentAvdelning.Contains("Adm") || currentAvdelning.Contains("mark"))
                        {
                            bool isSuccessfull = kBC.RemoveActivityAllocation(personnummer, columnName, currentCellValue, currentAvdelning);
                            if (isSuccessfull)
                            {
                                currentCellValue = "";
                            }
                        }
                        if (currentAvdelning.Contains("Drift") || currentAvdelning.Contains("Förv"))
                        {
                            bool isSuccessfull = kBC.RemoveProductAllocation(personnummer, columnName, currentCellValue, currentAvdelning);
                            if (isSuccessfull)
                            {
                                currentCellValue = "";
                            }
                        }
                    }
                    else
                    {
                        //Vill ej ta bort rad
                        dGVResursAllokering.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = currentCellValue;
                    }
                }
                if (nyAllokering != "")
                {
                    //Förändring av värde / Nytt värde
                    int number;
                    if (!int.TryParse(nyAllokering, out number) && nyAllokering != "")
                    {
                        dGVResursAllokering.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = currentCellValue;
                    }

                    else if (currentCellValue != nyAllokering)
                    {
                        //Checkar efter om det är en Ny allokering eller en förändring
                        if (currentCellValue == "" || currentCellValue == "0")
                        {
                            IsNewAllocation = true;
                        }
                        else
                        {
                            IsNewAllocation = false;
                        }

                        //Inmatning av ny Allokering
                        bool isSuccessfull = kBC.ValidateStaffOnProductAllocation(personnummer, nyAllokering, currentCellValue, columnName, currentAvdelning, IsNewAllocation);
                        if (!isSuccessfull)
                        {
                            MessageBox.Show("Inmatningen misslyckades");
                            dGVResursAllokering.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = currentCellValue;
                        }
                    }
                }
            }
        }

        //När man går in i en cell, sparar raden som den är för att återinsättas vid felinmatning
        private void dGVResursAllokering_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {

            currentCellValue = dGVResursAllokering.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
            CellChanging = true;
        }



    }
}
